package com.webank.openledger.contracts;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.fisco.bcos.sdk.abi.FunctionEncoder;
import org.fisco.bcos.sdk.abi.FunctionReturnDecoder;
import org.fisco.bcos.sdk.abi.TypeReference;
import org.fisco.bcos.sdk.abi.datatypes.Address;
import org.fisco.bcos.sdk.abi.datatypes.Bool;
import org.fisco.bcos.sdk.abi.datatypes.DynamicArray;
import org.fisco.bcos.sdk.abi.datatypes.Event;
import org.fisco.bcos.sdk.abi.datatypes.Function;
import org.fisco.bcos.sdk.abi.datatypes.Type;
import org.fisco.bcos.sdk.abi.datatypes.Utf8String;
import org.fisco.bcos.sdk.abi.datatypes.generated.Int256;
import org.fisco.bcos.sdk.abi.datatypes.generated.StaticArray2;
import org.fisco.bcos.sdk.abi.datatypes.generated.Uint256;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple1;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple2;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple3;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.contract.Contract;
import org.fisco.bcos.sdk.crypto.CryptoSuite;
import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.eventsub.EventCallback;
import org.fisco.bcos.sdk.model.CryptoType;
import org.fisco.bcos.sdk.model.TransactionReceipt;
import org.fisco.bcos.sdk.model.callback.TransactionCallback;
import org.fisco.bcos.sdk.transaction.model.exception.ContractException;

@SuppressWarnings("unchecked")
public class NonFungibleBook extends Contract {
    public static final String[] BINARY_ARRAY = {"60806040523480156200001157600080fd5b50604051620057e2380380620057e2833981018060405262000037919081019062000395565b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260019080600181540180825580915050906001820390600052602060002001600090919290919091505550611001600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c9080519060200190620000ff9291906200025c565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166356004b6a600c6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016200017a919062000552565b602060405180830381600087803b1580156200019557600080fd5b505af1158015620001aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001d0919081019062000404565b5080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200066d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200029f57805160ff1916838001178555620002d0565b82800160010185558215620002d0579182015b82811115620002cf578251825591602001919060010190620002b2565b5b509050620002df9190620002e3565b5090565b6200030891905b8082111562000304576000816000905550600101620002ea565b5090565b90565b60006200031982516200060d565b905092915050565b60006200032f82516200062d565b905092915050565b600082601f83011215156200034b57600080fd5b8151620003626200035c82620005ce565b620005a0565b915080825260208301602083018583830111156200037f57600080fd5b6200038c83828462000637565b50505092915050565b600080600060608486031215620003ab57600080fd5b6000620003bb868287016200030b565b935050602084015167ffffffffffffffff811115620003d957600080fd5b620003e78682870162000337565b9250506040620003fa868287016200030b565b9150509250925092565b6000602082840312156200041757600080fd5b6000620004278482850162000321565b91505092915050565b6000815460018116600081146200045057600181146200047157620004b6565b607f600283041680865260ff198316602087015260408601935050620004b6565b600282048086526020860195506200048985620005fb565b60005b82811015620004ad578154818901526001820191506020810190506200048c565b80880195505050505b505092915050565b6000600782527f626f6f6b5f6e6f000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000602e82527f7465726d5f6e6f2c7365712c66726f6d2c746f2c6e6f746549642c617373657460208301527f2c6f70657261746f722c646573630000000000000000000000000000000000006040830152606082019050919050565b600060608201905081810360008301526200056e818462000430565b905081810360208301526200058381620004be565b905081810360408301526200059881620004f5565b905092915050565b6000604051905081810181811067ffffffffffffffff82111715620005c457600080fd5b8060405250919050565b600067ffffffffffffffff821115620005e657600080fd5b601f19601f8301169050602081019050919050565b60008160005260206000209050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620006575780820151818401526020810190506200063a565b8381111562000667576000848401525b50505050565b615165806200067d6000396000f30060806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806338cc483114610072578063521ae5361461009d57806360f95a02146100da5780639b825e8214610118578063e953d0af14610156575b600080fd5b34801561007e57600080fd5b50610087610181565b60405161009491906148e1565b60405180910390f35b3480156100a957600080fd5b506100c460048036036100bf9190810190614102565b610189565b6040516100d1919061497f565b60405180910390f35b3480156100e657600080fd5b5061010160048036036100fc9190810190614017565b610921565b60405161010f9291906149a1565b60405180910390f35b34801561012457600080fd5b5061013f600480360361013a9190810190614096565b6113f3565b60405161014d92919061494f565b60405180910390f35b34801561016257600080fd5b5061016b611bbe565b6040516101789190614dff565b60405180910390f35b600030905090565b60606000606060006060600080606060008b5111806101a9575060008a51115b15156101ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101e190614d8a565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f23f63c9600c6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016102629190614a6e565b602060405180830381600087803b15801561027c57600080fd5b505af1158015610290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506102b49190810190614214565b96506102c08b8b6113f3565b80965081975050508673ffffffffffffffffffffffffffffffffffffffff16637857d7c96040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561032c57600080fd5b505af1158015610340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103649190810190614199565b92506000915060008b51118015610394575060008b600081518110151561038757fe5b9060200190602002015114155b15610441578273ffffffffffffffffffffffffffffffffffffffff1663cd30a1d16103d68d60008151811015156103c757fe5b90602001906020020151611c1b565b6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161040e9190614c16565b600060405180830381600087803b15801561042857600080fd5b505af115801561043c573d6000803e3d6000fd5b505050505b60018b5111801561046b575060008b600181518110151561045e57fe5b9060200190602002015114155b15610518578273ffffffffffffffffffffffffffffffffffffffff1663cd30a1d16104ad8d600181518110151561049e57fe5b90602001906020020151611c1b565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016104e59190614c8b565b600060405180830381600087803b1580156104ff57600080fd5b505af1158015610513573d6000803e3d6000fd5b505050505b60028b51118015610542575060008b600281518110151561053557fe5b9060200190602002015114155b156105ef578273ffffffffffffffffffffffffffffffffffffffff1663cd30a1d16105848d600281518110151561057557fe5b90602001906020020151611c1b565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016105bc9190614d55565b600060405180830381600087803b1580156105d657600080fd5b505af11580156105ea573d6000803e3d6000fd5b505050505b60008a511180156106455750600073ffffffffffffffffffffffffffffffffffffffff168a600081518110151561062257fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15610708578273ffffffffffffffffffffffffffffffffffffffff1663cd30a1d161069d8c600081518110151561067857fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16611d72565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016106d59190614b73565b600060405180830381600087803b1580156106ef57600080fd5b505af1158015610703573d6000803e3d6000fd5b505050505b60018a5111801561075e5750600073ffffffffffffffffffffffffffffffffffffffff168a600181518110151561073b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15610821578273ffffffffffffffffffffffffffffffffffffffff1663cd30a1d16107b68c600181518110151561079157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16611d72565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016107ee9190614b1e565b600060405180830381600087803b15801561080857600080fd5b505af115801561081c573d6000803e3d6000fd5b505050505b8273ffffffffffffffffffffffffffffffffffffffff16637ec1cc658a600081518110151561084c57fe5b906020019060200201518b600181518110151561086557fe5b906020019060200201516040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016108a89291906149e5565b600060405180830381600087803b1580156108c257600080fd5b505af11580156108d6573d6000803e3d6000fd5b505050506108e5868685611ee6565b8093508192505050600081511180156108fe5750600082135b156109105761090d81836121ee565b93505b839750505050505050509392505050565b600061092b613c53565b6000606060008060008061093d613c53565b60048c5110151515610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097b90614d8a565b60405180910390","fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663124b65b46040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b158015610a0957600080fd5b505af1158015610a1d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250610a4691908101906142d0565b80975081985050506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638662f51f6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610ad357600080fd5b505af1158015610ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b0b91908101906142a7565b9450610b1a87868e8e8e612be1565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f23f63c9600c6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610b949190614a6e565b602060405180830381600087803b158015610bae57600080fd5b505af1158015610bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610be69190810190614214565b92508273ffffffffffffffffffffffffffffffffffffffff166331afac36610c2e6002600160028054905003815481101515610c1e57fe5b9060005260206000200154611c1b565b866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610c68929190614a3e565b602060405180830381600087803b158015610c8257600080fd5b505af1158015610c96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610cba919081019061423d565b91507f16d624dce1a542b12776c04c8bc47047e182a4cd79844e7e7fb40593f9fd7cb68c8c8c85604051610cf194939291906148fc565b60405180910390a16008600088815260200190815260200160002060006002600160028054905003815481101515610d2557fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff161515610e0f57600360008881526020019081526020016000206002600160028054905003815481101515610d7c57fe5b9060005260206000200154908060018154018082558091505090600182039060005260206000200160009091929091909150555060016008600089815260200190815260200160002060006002600160028054905003815481101515610dde57fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6002600160028054905003815481101515610e2657fe5b90600052602060002001546004600087815260200190815260200160002081905550600960008d6002815181101515610e5b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002600160028054905003815481101515610eb857fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff16158015610f3157508b6002815181101515610ef657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614155b1561107b57600560008d6002815181101515610f4957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002600160028054905003815481101515610fa457fe5b906000526020600020015490806001815401808255809150509060018203906000526020600020016000909192909190915055506001600960008e6002815181101515610fed57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600260016002805490500381548110151561104a57fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600a60008d600381518110151561108e57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060026001600280549050038154811015156110eb57fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff1615801561116457508b600381518110151561112957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614155b156112ae57600660008d600381518110151561117c57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060026001600280549050038154811015156111d757fe5b906000526020600020015490806001815401808255809150509060018203906000526020600020016000909192909190915055506001600a60008e600381518110151561122057fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600260016002805490500381548110151561127d57fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600b60008c8152602001908152602001600020600060026001600280549050038154811015156112da57fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff1615156113c457600760008c8152602001908152602001600020600260016002805490500381548110151561133157fe5b906000526020600020015490806001815401808255809150509060018203906000526020600020016000909192909190915055506001600b60008d81526020019081526020016000206000600260016002805490500381548110151561139357fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b604080519081016040528088815260200186815250905060018214819850985050505050505050935093915050565b6060600060606000806000806000806002805490506040519080825280602002602001820160405280156114365781602001602082028038833980820191505090505b50965060018b51118015611463575060008b600181518110151561145657fe5b9060200190602002015114155b156114f1576000600460008d600181518110151561147d57fe5b906020019060200201518152602001908152602001600020541415156114f0576001876001600460008f60018151811015156114b557fe5b90602001906020020151815260200190815260200160002054038151811015156114db57fe5b90602001906020020190151590811515815250505b5b60008b5111801561151b575060008b600081518110151561150e57fe5b9060200190602002015114155b1561163657600095505b600360008c600081518110151561153857fe5b9060200190602002015181526020019081526020016000208054905086101561163557866001600360008e600081518110151561157157fe5b9060200190602002015181526020019081526020016000208881548110151561159657fe5b9060005260206000200154038151811015156115ae57fe5b906020019060200201511515611628576001876001600360008f60008151811015156115d657fe5b906020019060200201518152602001908152602001600020898154811015156115fb57fe5b90600052602060002001540381518110151561161357fe5b90602001906020020190151590811515815250505b8580600101965050611525565b5b60028b51118015611660575060008b600281518110151561165357fe5b9060200190602002015114155b1561177b57600094505b600760008c600281518110151561167d57fe5b9060200190602002015181526020019081526020016000208054905085101561177a57866001600760008e60028151811015156116b657fe5b906020019060200201518152602001908152602001600020878154811015156116db57fe5b9060005260206000200154038151811015156116f357fe5b90602001906020020151151561176d576001876001600760008f600281518110151561171b57fe5b9060200190602002015181526020019081526020016000208881548110151561174057fe5b90600052602060002001540381518110151561175857fe5b90602001906020020190151590811515815250505b848060010195505061166a565b5b60008a511180156117d15750600073ffffffffffffffffffffffffffffffffffffffff168a60008151811015156117ae57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b1561197057600093505b600560008b60008151811015156117ee57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905084101561196f57866001600560008d600081518110151561185357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020868154811015156118a457fe5b9060005260206000200154038151811015156118bc57fe5b906020019060200201511515611962576001876001600560008e60008151811015156118e457fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208781548110151561193557fe5b90600052602060002001540381518110151561194d57fe5b90602001906020020190151590811515815250505b83806001019450506117db565b5b60018a511180156119c65750600073ffffff","ffffffffffffffffffffffffffffffffff168a60018151811015156119a357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15611b6557600092505b600660008b60018151811015156119e357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050831015611b6457866001600660008d6001815181101515611a4857fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481101515611a9957fe5b906000526020600020015403815181101515611ab157fe5b906020019060200201511515611b57576001876001600660008e6001815181101515611ad957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002086815481101515611b2a57fe5b906000526020600020015403815181101515611b4257fe5b90602001906020020190151590811515815250505b82806001019350506119d0565b5b60009150600090505b8651811015611baa578681815181101515611b8557fe5b9060200190602002015115611b9d5781806001019250505b8080600101915050611b6e565b868298509850505050505050509250929050565b6000600260016002805490500190806001815401808255809150509060018203906000526020600020016000909192909190915055506002600160028054905003815481101515611c0b57fe5b9060005260206000200154905090565b60606000806060600080861415611c69576040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509450611d69565b8593505b600084141515611c93578280600101935050600a84811515611c8b57fe5b049350611c6d565b826040519080825280601f01601f191660200182016040528015611cc65781602001602082028038833980820191505090505b5091506001830390505b600086141515611d6557600a86811515611ce657fe5b066030017f010000000000000000000000000000000000000000000000000000000000000002828280600190039350815181101515611d2157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86811515611d5d57fe5b049550611cd0565b8194505b50505050919050565b60606000806000606060008673ffffffffffffffffffffffffffffffffffffffff1694506000851415611ddc576040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509550611edc565b8493505b600084141515611e06578280600101935050600a84811515611dfe57fe5b049350611de0565b826040519080825280601f01601f191660200182016040528015611e395781602001602082028038833980820191505090505b5091506001830390505b600085141515611ed857600a85811515611e5957fe5b066030017f010000000000000000000000000000000000000000000000000000000000000002828280600190039350815181101515611e9457fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85811515611ed057fe5b049450611e43565b8195505b5050505050919050565b6060600080600060606000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f23f63c9600c6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611f6c9190614a6e565b602060405180830381600087803b158015611f8657600080fd5b505af1158015611f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611fbe9190810190614214565b95506000945089604051908082528060200260200182016040528015611ff35781602001602082028038833980820191505090505b50935060009250600091505b8a518210156121da578a8281518110151561201657fe5b90602001906020020151156121cd578573ffffffffffffffffffffffffffffffffffffffff1663e8434e3961204d60018501611c1b565b8b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612087929190614a0e565b602060405180830381600087803b1580156120a157600080fd5b505af11580156120b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120d991908101906141c2565b90508073ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561213f57600080fd5b505af1158015612153573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612177919081019061423d565b8501945080848480600101955081518110151561219057fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b8180600101925050611fff565b838597509750505050505050935093915050565b606080600080600080600060606008890260405190808252806020026020018201604052801561223257816020015b606081526020019060019003908161221d5790505b509650600095505b8951861015612bd157898681518110151561225157fe5b90602001906020020151945060009350600092505b8473ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156122ca57600080fd5b505af11580156122de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612302919081019061423d565b831215612bc4578473ffffffffffffffffffffffffffffffffffffffff1663846719e0846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161235e91906149ca565b602060405180830381600087803b15801561237857600080fd5b505af115801561238c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123b091908101906141eb565b9150600093506125b78273ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161240c90614b53565b600060405180830381600087803b15801561242657600080fd5b505af115801561243a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506124639190810190614266565b8373ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016124b690614afe565b600060405180830381600087803b1580156124d057600080fd5b505af11580156124e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061250d9190810190614266565b8473ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161256090614ba8565b602060405180830381600087803b15801561257a57600080fd5b505af115801561258e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125b29190810190613fee565b613312565b9050600381511415156125ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f690614ade565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161265290614bf6565b600060405180830381600087803b15801561266c57600080fd5b505af1158015612680573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506126a99190810190614266565b878585600802018151811015156126bc57fe5b906020019060200201819052508173ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161271c90614c6b565b600060405180830381600087803b15801561273657600080fd5b505af115801561274a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506127739190810190614266565b8785600101955085856008020181518110151561278c57fe5b906020019060200201819052508060008151811015156127a857fe5b90602001906020020151878560010195508585600802018151811015156127cb57fe5b906020019060200201819052508060018151811015156127e757fe5b906020019060200201518785600101955085856008020181518110151561280a57fe5b90602001906020020181905250612999600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f02b8c8c61290a8573ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016128ae90614d35565b600060405180830381600087803b1580156128c857600080fd5b505af11580156128dc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506129059190810190614266565b6138b1565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016129429190614dff565b602060405180830381600087803b15801561295c57600080fd5b505af1158015612970573d6000803e3d6000fd5b505050506040513d601f19601f8201168201","806040525061299491908101906142a7565b611c1b565b878560010195508585600802018151811015156129b257fe5b906020019060200201819052508173ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612a1290614cc0565b600060405180830381600087803b158015612a2c57600080fd5b505af1158015612a40573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250612a699190810190614266565b87856001019550858560080201815181101515612a8257fe5b90602001906020020181905250612b528273ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612ae590614a90565b602060405180830381600087803b158015612aff57600080fd5b505af1158015612b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b379190810190613fee565b73ffffffffffffffffffffffffffffffffffffffff16611d72565b87856001019550858560080201815181101515612b6b57fe5b90602001906020020181905250806002815181101515612b8757fe5b9060200190602002015187856001019550858560080201815181101515612baa57fe5b906020019060200201819052508280600101935050612266565b858060010196505061223a565b8697505050505050505092915050565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f23f63c9600c6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612c5e9190614a6e565b602060405180830381600087803b158015612c7857600080fd5b505af1158015612c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cb09190810190614214565b91508173ffffffffffffffffffffffffffffffffffffffff166313db93466040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612d1657600080fd5b505af1158015612d2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d4e91908101906141eb565b90508073ffffffffffffffffffffffffffffffffffffffff1663e942b516612d966002600160028054905003815481101515612d8657fe5b9060005260206000200154611c1b565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612dce9190614daa565b600060405180830381600087803b158015612de857600080fd5b505af1158015612dfc573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e942b516612e2589611c1b565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612e5d9190614c8b565b600060405180830381600087803b158015612e7757600080fd5b505af1158015612e8b573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e942b516612eb48a611c1b565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612eec9190614c16565b600060405180830381600087803b158015612f0657600080fd5b505af1158015612f1a573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e942b516612f71886002815181101515612f4c57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16611d72565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612fa99190614b73565b600060405180830381600087803b158015612fc357600080fd5b505af1158015612fd7573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e942b51661302e88600381518110151561300957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16611d72565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016130669190614b1e565b600060405180830381600087803b15801561308057600080fd5b505af1158015613094573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663a815ff158760018151811015156130c357fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016131059190614ab0565b600060405180830381600087803b15801561311f57600080fd5b505af1158015613133573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e942b51661315c87611c1b565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016131949190614d55565b600060405180830381600087803b1580156131ae57600080fd5b505af11580156131c2573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663a815ff158760008151811015156131f157fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016132339190614bc8565b600060405180830381600087803b15801561324d57600080fd5b505af1158015613261573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e942b51685600081518110151561329057fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016132d29190614ce0565b600060405180830381600087803b1580156132ec57600080fd5b505af1158015613300573d6000803e3d6000fd5b50505050809250505095945050505050565b606080600080600360405190808252806020026020018201604052801561334d57816020015b60608152602001906001900390816133385790505b50925060008751118015613396575061336587613a82565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614155b1561352057600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346438ca06133e289613a82565b6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161341a91906148e1565b602060405180830381600087803b15801561343457600080fd5b505af1158015613448573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061346c9190810190613fee565b90508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16141515156134e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d790614d15565b60405180910390fd5b6134ff8173ffffffffffffffffffffffffffffffffffffffff16611d72565b83600081518110151561350e57fe5b9060200190602002018190525061353e565b8683600081518110151561353057fe5b906020019060200201819052505b60008651118015613584575061355386613a82565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614155b1561370e57600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346438ca06135d088613a82565b6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161360891906148e1565b602060405180830381600087803b15801561362257600080fd5b505af1158015613636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061365a9190810190613fee565b90508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16141515156136ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c590614ddf565b60405180910390fd5b6136ed8173ffffffffffffffffffffffffffffffffffffffff16611d72565b8360018151811015156136fc57fe5b9060200190602002018190525061372c565b8583600181518110151561371e57fe5b906020019060200201819052505b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346438ca0866040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016137a391906148e1565b602060405180830381600087803b1580156137bd57600080fd5b505af11580156137d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137f59190810190613fee565b90508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614151515613869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386090614c4b565b60405180910390fd5b6138888173ffffffffffffffffffffffffffffffffffffffff16611d72565b83600281518110151561389757fe5b906020019060200201819052508293505050509392505050565b6000606060008084925060009150600090505b8251811015613a7757603083828151811015156138dd57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff16101580156139db57506039838281518110151561396757fe5b9060200101517f0100000000000000000000000000000000000000","00000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff1611155b15613a6a57603083828151811015156139f057fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090040360ff16600a83020191505b80806001019150506138c4565b819350505050919050565b6000606060008084925060009150600090505b8251811015613c485760308382815181101515613aae57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff1610158015613bac575060398382815181101515613b3857fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff1611155b15613c3b5760308382815181101515613bc157fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090040360ff16600a83020191505b8080600101915050613a95565b819350505050919050565b6040805190810160405280600290602082028038833980820191505090505090565b6000613c818235615038565b905092915050565b6000613c958251615038565b905092915050565b600082601f8301121515613cb057600080fd5b8135613cc3613cbe82614e47565b614e1a565b91508181835260208401935060208101905083856020840282011115613ce857600080fd5b60005b83811015613d185781613cfe8882613c75565b845260208401935060208301925050600181019050613ceb565b5050505092915050565b600082601f8301121515613d3557600080fd5b8135613d48613d4382614e6f565b614e1a565b91508181835260208401935060208101905083856020840282011115613d6d57600080fd5b60005b83811015613d9d5781613d838882613ef2565b845260208401935060208301925050600181019050613d70565b5050505092915050565b600082601f8301121515613dba57600080fd5b8135613dcd613dc882614e97565b614e1a565b9150818183526020840193506020810190508360005b83811015613e135781358601613df98882613f1a565b845260208401935060208301925050600181019050613de3565b5050505092915050565b600082601f8301121515613e3057600080fd5b8135613e43613e3e82614ebf565b614e1a565b91508181835260208401935060208101905083856020840282011115613e6857600080fd5b60005b83811015613e985781613e7e8882613fc6565b845260208401935060208301925050600181019050613e6b565b5050505092915050565b6000613eae8251615058565b905092915050565b6000613ec2825161506a565b905092915050565b6000613ed6825161507c565b905092915050565b6000613eea825161508e565b905092915050565b6000613efe82356150a0565b905092915050565b6000613f1282516150a0565b905092915050565b600082601f8301121515613f2d57600080fd5b8135613f40613f3b82614ee7565b614e1a565b91508082526020830160208301858383011115613f5c57600080fd5b613f678382846150d8565b50505092915050565b600082601f8301121515613f8357600080fd5b8151613f96613f9182614f13565b614e1a565b91508082526020830160208301858383011115613fb257600080fd5b613fbd8382846150e7565b50505092915050565b6000613fd282356150aa565b905092915050565b6000613fe682516150aa565b905092915050565b60006020828403121561400057600080fd5b600061400e84828501613c89565b91505092915050565b60008060006060848603121561402c57600080fd5b600084013567ffffffffffffffff81111561404657600080fd5b61405286828701613c9d565b935050602061406386828701613fc6565b925050604084013567ffffffffffffffff81111561408057600080fd5b61408c86828701613da7565b9150509250925092565b600080604083850312156140a957600080fd5b600083013567ffffffffffffffff8111156140c357600080fd5b6140cf85828601613e1d565b925050602083013567ffffffffffffffff8111156140ec57600080fd5b6140f885828601613c9d565b9150509250929050565b60008060006060848603121561411757600080fd5b600084013567ffffffffffffffff81111561413157600080fd5b61413d86828701613e1d565b935050602084013567ffffffffffffffff81111561415a57600080fd5b61416686828701613c9d565b925050604084013567ffffffffffffffff81111561418357600080fd5b61418f86828701613d22565b9150509250925092565b6000602082840312156141ab57600080fd5b60006141b984828501613ea2565b91505092915050565b6000602082840312156141d457600080fd5b60006141e284828501613eb6565b91505092915050565b6000602082840312156141fd57600080fd5b600061420b84828501613eca565b91505092915050565b60006020828403121561422657600080fd5b600061423484828501613ede565b91505092915050565b60006020828403121561424f57600080fd5b600061425d84828501613f06565b91505092915050565b60006020828403121561427857600080fd5b600082015167ffffffffffffffff81111561429257600080fd5b61429e84828501613f70565b91505092915050565b6000602082840312156142b957600080fd5b60006142c784828501613fda565b91505092915050565b600080604083850312156142e357600080fd5b60006142f185828601613fda565b925050602083015167ffffffffffffffff81111561430e57600080fd5b61431a85828601613f70565b9150509250929050565b61432d81614ff8565b82525050565b600061433e82614f82565b80845260208401935061435083614f3f565b60005b8281101561438257614366868351614324565b61436f82614fc4565b9150602086019550600181019050614353565b50849250505092915050565b600061439982614f8d565b8084526020840193506143ab83614f4c565b60005b828110156143dd576143c18683516144a2565b6143ca82614fd1565b91506020860195506001810190506143ae565b50849250505092915050565b60006143f482614f98565b8084526020840193508360208202850161440d85614f59565b60005b84811015614446578383038852614428838351614514565b925061443382614fde565b9150602088019750600181019050614410565b508196508694505050505092915050565b61446081614fa3565b61446982614f66565b60005b8281101561449b5761447f8583516148d2565b61448882614feb565b915060208501945060018101905061446c565b5050505050565b6144ab81615018565b82525050565b6144ba816150b4565b82525050565b6144c9816150c6565b82525050565b6144d881615024565b82525050565b60006144e982614fb9565b8084526144fd8160208601602086016150e7565b6145068161511a565b602085010191505092915050565b600061451f82614fae565b8084526145338160208601602086016150e7565b61453c8161511a565b602085010191505092915050565b6000815460018116600081146145675760018114614587576145c8565b607f600283041680865260ff1983166020870152604086019350506145c8565b6002820480865260208601955061459d85614f70565b60005b828110156145bf578154818901526001820191506020810190506145a0565b80880195505050505b505092915050565b6000600582527f61737365740000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601282527f6163636f756e74206e6f742076657269667900000000000000000000000000006020830152604082019050919050565b6000600282527f746f0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f66726f6d000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600882527f6f70657261746f720000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600782527f7465726d5f6e6f000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601a82527f6f70657261746f72206163636f756e74206e6f7420666f756e640000000000006020830152604082019050919050565b6000600382527f73657100000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f64657363000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601682527f66726f6d206163636f756e74206e6f7420666f756e64000000000000000000006020830152604082019050919050565b6000600682527f6e6f7465496400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601882527f506172616d73206973206e6f7420636f6d706c69616e636500000000000000006020830152604082019050919050565b6000600782527f626f6f6b5f6e6f000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601482527f746f206163636f756e74206e6f7420666f756e640000000000000000000000006020830152604082019050919050565b6148db8161502e565b82525050565b60006020820190506148f66000830184614324565b92915050565b600060808201905081810360008301526149168187614333565b905061492560208301866148d2565b818103604083015261493781856143e9565b905061494660608301846144cf565b95945050505050565b60006040820190508181036000830152614969818561438e565b905061497860208301846148d2565b9392505050565b600060","2082019050818103600083015261499981846143e9565b905092915050565b60006060820190506149b660008301856144a2565b6149c36020830184614457565b9392505050565b60006020820190506149df60008301846144cf565b92915050565b60006040820190506149fa60008301856144cf565b614a0760208301846144cf565b9392505050565b60006040820190508181036000830152614a2881856144de565b9050614a3760208301846144b1565b9392505050565b60006040820190508181036000830152614a5881856144de565b9050614a6760208301846144c0565b9392505050565b60006020820190508181036000830152614a88818461454a565b905092915050565b60006020820190508181036000830152614aa9816145d0565b9050919050565b60006040820190508181036000830152614ac9816145d0565b9050614ad86020830184614324565b92915050565b60006020820190508181036000830152614af781614607565b9050919050565b60006020820190508181036000830152614b178161463e565b9050919050565b60006040820190508181036000830152614b378161463e565b90508181036020830152614b4b81846144de565b905092915050565b60006020820190508181036000830152614b6c81614675565b9050919050565b60006040820190508181036000830152614b8c81614675565b90508181036020830152614ba081846144de565b905092915050565b60006020820190508181036000830152614bc1816146ac565b9050919050565b60006040820190508181036000830152614be1816146ac565b9050614bf06020830184614324565b92915050565b60006020820190508181036000830152614c0f816146e3565b9050919050565b60006040820190508181036000830152614c2f816146e3565b90508181036020830152614c4381846144de565b905092915050565b60006020820190508181036000830152614c648161471a565b9050919050565b60006020820190508181036000830152614c8481614751565b9050919050565b60006040820190508181036000830152614ca481614751565b90508181036020830152614cb881846144de565b905092915050565b60006020820190508181036000830152614cd981614788565b9050919050565b60006040820190508181036000830152614cf981614788565b90508181036020830152614d0d8184614514565b905092915050565b60006020820190508181036000830152614d2e816147bf565b9050919050565b60006020820190508181036000830152614d4e816147f6565b9050919050565b60006040820190508181036000830152614d6e816147f6565b90508181036020830152614d8281846144de565b905092915050565b60006020820190508181036000830152614da38161482d565b9050919050565b60006040820190508181036000830152614dc381614864565b90508181036020830152614dd781846144de565b905092915050565b60006020820190508181036000830152614df88161489b565b9050919050565b6000602082019050614e1460008301846148d2565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e3d57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e5e57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614e8657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614eae57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614ed657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614efe57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f2a57600080fd5b601f19601f8301169050602081019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000819050919050565b60008160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061506382614ff8565b9050919050565b600061507582614ff8565b9050919050565b600061508782614ff8565b9050919050565b600061509982614ff8565b9050919050565b6000819050919050565b6000819050919050565b60006150bf82614ff8565b9050919050565b60006150d182614ff8565b9050919050565b82818337600083830152505050565b60005b838110156151055780820151818401526020810190506150ea565b83811115615114576000848401525b50505050565b6000601f19601f83011690509190505600a265627a7a7230582008918ebfd080dcdaf09baf75bb707bf72db71df4d8b282931766d2786f32e6a86c6578706572696d656e74616cf50037"};

    public static final String BINARY = String.join("", BINARY_ARRAY);

    public static final String[] SM_BINARY_ARRAY = {"60806040523480156200001157600080fd5b50604051620057e2380380620057e2833981018060405262000037919081019062000395565b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260019080600181540180825580915050906001820390600052602060002001600090919290919091505550611001600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c9080519060200190620000ff9291906200025c565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c92a7801600c6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016200017a919062000552565b602060405180830381600087803b1580156200019557600080fd5b505af1158015620001aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001d0919081019062000404565b5080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200066d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200029f57805160ff1916838001178555620002d0565b82800160010185558215620002d0579182015b82811115620002cf578251825591602001919060010190620002b2565b5b509050620002df9190620002e3565b5090565b6200030891905b8082111562000304576000816000905550600101620002ea565b5090565b90565b60006200031982516200060d565b905092915050565b60006200032f82516200062d565b905092915050565b600082601f83011215156200034b57600080fd5b8151620003626200035c82620005ce565b620005a0565b915080825260208301602083018583830111156200037f57600080fd5b6200038c83828462000637565b50505092915050565b600080600060608486031215620003ab57600080fd5b6000620003bb868287016200030b565b935050602084015167ffffffffffffffff811115620003d957600080fd5b620003e78682870162000337565b9250506040620003fa868287016200030b565b9150509250925092565b6000602082840312156200041757600080fd5b6000620004278482850162000321565b91505092915050565b6000815460018116600081146200045057600181146200047157620004b6565b607f600283041680865260ff198316602087015260408601935050620004b6565b600282048086526020860195506200048985620005fb565b60005b82811015620004ad578154818901526001820191506020810190506200048c565b80880195505050505b505092915050565b6000602e82527f7465726d5f6e6f2c7365712c66726f6d2c746f2c6e6f746549642c617373657460208301527f2c6f70657261746f722c646573630000000000000000000000000000000000006040830152606082019050919050565b6000600782527f626f6f6b5f6e6f000000000000000000000000000000000000000000000000006020830152604082019050919050565b600060608201905081810360008301526200056e818462000430565b9050818103602083015262000583816200051b565b905081810360408301526200059881620004be565b905092915050565b6000604051905081810181811067ffffffffffffffff82111715620005c457600080fd5b8060405250919050565b600067ffffffffffffffff821115620005e657600080fd5b601f19601f8301169050602081019050919050565b60008160005260206000209050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620006575780820151818401526020810190506200063a565b8381111562000667576000848401525b50505050565b615165806200067d6000396000f30060806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806311567c421461007257806345be589e1461009d578063b32cf81b146100c8578063c19f641414610105578063d121179914610143575b600080fd5b34801561007e57600080fd5b50610087610181565b60405161009491906148e1565b60405180910390f35b3480156100a957600080fd5b506100b2610189565b6040516100bf9190614dff565b60405180910390f35b3480156100d457600080fd5b506100ef60048036036100ea9190810190614102565b6101e6565b6040516100fc919061497f565b60405180910390f35b34801561011157600080fd5b5061012c60048036036101279190810190614096565b61097e565b60405161013a92919061494f565b60405180910390f35b34801561014f57600080fd5b5061016a60048036036101659190810190614017565b611149565b6040516101789291906149a1565b60405180910390f35b600030905090565b60006002600160028054905001908060018154018082558091505090600182039060005260206000200160009091929091909150555060026001600280549050038154811015156101d657fe5b9060005260206000200154905090565b60606000606060006060600080606060008b511180610206575060008a51115b1515610247576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040161023e90614d6a565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166359a48b65600c6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016102bf9190614a6e565b602060405180830381600087803b1580156102d957600080fd5b505af11580156102ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103119190810190614214565b965061031d8b8b61097e565b80965081975050508673ffffffffffffffffffffffffffffffffffffffff1663c74f8caf6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561038957600080fd5b505af115801561039d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103c19190810190614199565b92506000915060008b511180156103f1575060008b60008151811015156103e457fe5b9060200190602002015114155b1561049e578273ffffffffffffffffffffffffffffffffffffffff1663ae763db56104338d600081518110151561042457fe5b90602001906020020151611c1b565b6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161046b9190614d35565b600060405180830381600087803b15801561048557600080fd5b505af1158015610499573d6000803e3d6000fd5b505050505b60018b511180156104c8575060008b60018151811015156104bb57fe5b9060200190602002015114155b15610575578273ffffffffffffffffffffffffffffffffffffffff1663ae763db561050a8d60018151811015156104fb57fe5b90602001906020020151611c1b565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016105429190614b93565b600060405180830381600087803b15801561055c57600080fd5b505af1158015610570573d6000803e3d6000fd5b505050505b60028b5111801561059f575060008b600281518110151561059257fe5b9060200190602002015114155b1561064c578273ffffffffffffffffffffffffffffffffffffffff1663ae763db56105e18d60028151811015156105d257fe5b90602001906020020151611c1b565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016106199190614c3d565b600060405180830381600087803b15801561063357600080fd5b505af1158015610647573d6000803e3d6000fd5b505050505b60008a511180156106a25750600073ffffffffffffffffffffffffffffffffffffffff168a600081518110151561067f57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15610765578273ffffffffffffffffffffffffffffffffffffffff1663ae763db56106fa8c60008151811015156106d557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16611d72565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016107329190614be8565b600060405180830381600087803b15801561074c57600080fd5b505af1158015610760573d6000803e3d6000fd5b505050505b60018a511180156107bb5750600073ffffffffffffffffffffffffffffffffffffffff168a600181518110151561079857fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b1561087e578273ffffffffffffffffffffffffffffffffffffffff1663ae763db56108138c60018151811015156107ee57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16611d72565b6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161084b9190614dca565b600060405180830381600087803b15801561086557600080fd5b505af1158015610879573d6000803e3d6000fd5b505050505b8273ffffffffffffffffffffffffffffffffffffffff1663324927378a60008151811015156108a957fe5b906020019060200201518b60018151811015156108c257fe5b906020019060200201516040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016109059291906149e5565b600060405180830381600087803b15801561091f57600080fd5b505af1158015610933573d6000803e3d6000fd5b50505050610942868685611ee6565b80935081925050506000815111801561095b5750600082135b1561096d5761096a81836121ee565b93505b839750505050505050509392505050565b60606000","60606000806000806000806002805490506040519080825280602002602001820160405280156109c15781602001602082028038833980820191505090505b50965060018b511180156109ee575060008b60018151811015156109e157fe5b9060200190602002015114155b15610a7c576000600460008d6001815181101515610a0857fe5b90602001906020020151815260200190815260200160002054141515610a7b576001876001600460008f6001815181101515610a4057fe5b9060200190602002015181526020019081526020016000205403815181101515610a6657fe5b90602001906020020190151590811515815250505b5b60008b51118015610aa6575060008b6000815181101515610a9957fe5b9060200190602002015114155b15610bc157600095505b600360008c6000815181101515610ac357fe5b90602001906020020151815260200190815260200160002080549050861015610bc057866001600360008e6000815181101515610afc57fe5b90602001906020020151815260200190815260200160002088815481101515610b2157fe5b906000526020600020015403815181101515610b3957fe5b906020019060200201511515610bb3576001876001600360008f6000815181101515610b6157fe5b90602001906020020151815260200190815260200160002089815481101515610b8657fe5b906000526020600020015403815181101515610b9e57fe5b90602001906020020190151590811515815250505b8580600101965050610ab0565b5b60028b51118015610beb575060008b6002815181101515610bde57fe5b9060200190602002015114155b15610d0657600094505b600760008c6002815181101515610c0857fe5b90602001906020020151815260200190815260200160002080549050851015610d0557866001600760008e6002815181101515610c4157fe5b90602001906020020151815260200190815260200160002087815481101515610c6657fe5b906000526020600020015403815181101515610c7e57fe5b906020019060200201511515610cf8576001876001600760008f6002815181101515610ca657fe5b90602001906020020151815260200190815260200160002088815481101515610ccb57fe5b906000526020600020015403815181101515610ce357fe5b90602001906020020190151590811515815250505b8480600101955050610bf5565b5b60008a51118015610d5c5750600073ffffffffffffffffffffffffffffffffffffffff168a6000815181101515610d3957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15610efb57600093505b600560008b6000815181101515610d7957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050841015610efa57866001600560008d6000815181101515610dde57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002086815481101515610e2f57fe5b906000526020600020015403815181101515610e4757fe5b906020019060200201511515610eed576001876001600560008e6000815181101515610e6f57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002087815481101515610ec057fe5b906000526020600020015403815181101515610ed857fe5b90602001906020020190151590811515815250505b8380600101945050610d66565b5b60018a51118015610f515750600073ffffffffffffffffffffffffffffffffffffffff168a6001815181101515610f2e57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b156110f057600092505b600660008b6001815181101515610f6e57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508310156110ef57866001600660008d6001815181101515610fd357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110151561102457fe5b90600052602060002001540381518110151561103c57fe5b9060200190602002015115156110e2576001876001600660008e600181518110151561106457fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020868154811015156110b557fe5b9060005260206000200154038151811015156110cd57fe5b90602001906020020190151590811515815250505b8280600101935050610f5b565b5b60009150600090505b865181101561113557868181518110151561111057fe5b90602001906020020151156111285781806001019250505b80806001019150506110f9565b868298509850505050505050509250929050565b6000611153613c53565b60006060600080600080611165613c53565b60048c51101515156111ac576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016111a390614d6a565b60405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631bf727356040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15801561123157600080fd5b505af1158015611245573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061126e91908101906142d0565b80975081985050506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd332ffe6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156112fb57600080fd5b505af115801561130f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061133391908101906142a7565b945061134287868e8e8e612be1565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166359a48b65600c6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016113bc9190614a6e565b602060405180830381600087803b1580156113d657600080fd5b505af11580156113ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061140e9190810190614214565b92508273ffffffffffffffffffffffffffffffffffffffff16634c6f30c0611456600260016002805490500381548110151561144657fe5b9060005260206000200154611c1b565b866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611490929190614a3e565b602060405180830381600087803b1580156114aa57600080fd5b505af11580156114be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114e2919081019061423d565b91507f246d61ff6a7af5762a067fba9052b5d9f4c893cf3b8358ee15d4b0e9300068f68c8c8c8560405161151994939291906148fc565b60405180910390a1600860008881526020019081526020016000206000600260016002805490500381548110151561154d57fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff161515611637576003600088815260200190815260200160002060026001600280549050038154811015156115a457fe5b906000526020600020015490806001815401808255809150509060018203906000526020600020016000909192909190915055506001600860008981526020019081526020016000206000600260016002805490500381548110151561160657fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600260016002805490500381548110151561164e57fe5b90600052602060002001546004600087815260200190815260200160002081905550600960008d600281518110151561168357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060026001600280549050038154811015156116e057fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff1615801561175957508b600281518110151561171e57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614155b156118a357600560008d600281518110151561177157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060026001600280549050038154811015156117cc57fe5b906000526020600020015490806001815401808255809150509060018203906000526020600020016000909192909190915055506001600960008e600281518110151561181557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600260016002805490500381548110151561187257fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600a60008d60038151811015156118b657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600260016002805490500381548110151561191357fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff1615801561198c57508b600381518110151561195157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffff","ffffffffffff1614155b15611ad657600660008d60038151811015156119a457fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060026001600280549050038154811015156119ff57fe5b906000526020600020015490806001815401808255809150509060018203906000526020600020016000909192909190915055506001600a60008e6003815181101515611a4857fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002600160028054905003815481101515611aa557fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600b60008c815260200190815260200160002060006002600160028054905003815481101515611b0257fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff161515611bec57600760008c81526020019081526020016000206002600160028054905003815481101515611b5957fe5b906000526020600020015490806001815401808255809150509060018203906000526020600020016000909192909190915055506001600b60008d815260200190815260200160002060006002600160028054905003815481101515611bbb57fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b604080519081016040528088815260200186815250905060018214819850985050505050505050935093915050565b60606000806060600080861415611c69576040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509450611d69565b8593505b600084141515611c93578280600101935050600a84811515611c8b57fe5b049350611c6d565b826040519080825280601f01601f191660200182016040528015611cc65781602001602082028038833980820191505090505b5091506001830390505b600086141515611d6557600a86811515611ce657fe5b066030017f010000000000000000000000000000000000000000000000000000000000000002828280600190039350815181101515611d2157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86811515611d5d57fe5b049550611cd0565b8194505b50505050919050565b60606000806000606060008673ffffffffffffffffffffffffffffffffffffffff1694506000851415611ddc576040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509550611edc565b8493505b600084141515611e06578280600101935050600a84811515611dfe57fe5b049350611de0565b826040519080825280601f01601f191660200182016040528015611e395781602001602082028038833980820191505090505b5091506001830390505b600085141515611ed857600a85811515611e5957fe5b066030017f010000000000000000000000000000000000000000000000000000000000000002828280600190039350815181101515611e9457fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85811515611ed057fe5b049450611e43565b8195505b5050505050919050565b6060600080600060606000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166359a48b65600c6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611f6c9190614a6e565b602060405180830381600087803b158015611f8657600080fd5b505af1158015611f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611fbe9190810190614214565b95506000945089604051908082528060200260200182016040528015611ff35781602001602082028038833980820191505090505b50935060009250600091505b8a518210156121da578a8281518110151561201657fe5b90602001906020020151156121cd578573ffffffffffffffffffffffffffffffffffffffff1663d8ac595761204d60018501611c1b565b8b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612087929190614a0e565b602060405180830381600087803b1580156120a157600080fd5b505af11580156120b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120d991908101906141c2565b90508073ffffffffffffffffffffffffffffffffffffffff1663d3e9af5a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561213f57600080fd5b505af1158015612153573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612177919081019061423d565b8501945080848480600101955081518110151561219057fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b8180600101925050611fff565b838597509750505050505050935093915050565b606080600080600080600060606008890260405190808252806020026020018201604052801561223257816020015b606081526020019060019003908161221d5790505b509650600095505b8951861015612bd157898681518110151561225157fe5b90602001906020020151945060009350600092505b8473ffffffffffffffffffffffffffffffffffffffff1663d3e9af5a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156122ca57600080fd5b505af11580156122de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612302919081019061423d565b831215612bc4578473ffffffffffffffffffffffffffffffffffffffff16633dd2b614846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161235e91906149ca565b602060405180830381600087803b15801561237857600080fd5b505af115801561238c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123b091908101906141eb565b9150600093506125b78273ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161240c90614bc8565b600060405180830381600087803b15801561242657600080fd5b505af115801561243a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506124639190810190614266565b8373ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016124b690614daa565b600060405180830381600087803b1580156124d057600080fd5b505af11580156124e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061250d9190810190614266565b8473ffffffffffffffffffffffffffffffffffffffff166307afbf3a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161256090614b05565b602060405180830381600087803b15801561257a57600080fd5b505af115801561258e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125b29190810190613fee565b613312565b9050600381511415156125ff576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016125f690614a90565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161265290614d15565b600060405180830381600087803b15801561266c57600080fd5b505af1158015612680573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506126a99190810190614266565b878585600802018151811015156126bc57fe5b906020019060200201819052508173ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161271c90614b73565b600060405180830381600087803b15801561273657600080fd5b505af115801561274a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506127739190810190614266565b8785600101955085856008020181518110151561278c57fe5b906020019060200201819052508060008151811015156127a857fe5b90602001906020020151878560010195508585600802018151811015156127cb57fe5b906020019060200201819052508060018151811015156127e757fe5b906020019060200201518785600101955085856008020181518110151561280a57fe5b90602001906020020181905250612999600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633889c9e461290a8573ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016128ae90614c1d565b600060405180830381600087803b1580156128c857600080fd5b505af11580156128dc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506129059190810190614266565b6138b1565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016129429190614dff565b602060405180830381600087803b15801561295c57600080fd5b505af1158015612970573d6000803e3d6000fd5b505050506040513d601f19601f8201168201","806040525061299491908101906142a7565b611c1b565b878560010195508585600802018151811015156129b257fe5b906020019060200201819052508173ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612a1290614ab0565b600060405180830381600087803b158015612a2c57600080fd5b505af1158015612a40573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250612a699190810190614266565b87856001019550858560080201815181101515612a8257fe5b90602001906020020181905250612b528273ffffffffffffffffffffffffffffffffffffffff166307afbf3a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612ae590614c72565b602060405180830381600087803b158015612aff57600080fd5b505af1158015612b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b379190810190613fee565b73ffffffffffffffffffffffffffffffffffffffff16611d72565b87856001019550858560080201815181101515612b6b57fe5b90602001906020020181905250806002815181101515612b8757fe5b9060200190602002015187856001019550858560080201815181101515612baa57fe5b906020019060200201819052508280600101935050612266565b858060010196505061223a565b8697505050505050505092915050565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166359a48b65600c6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612c5e9190614a6e565b602060405180830381600087803b158015612c7857600080fd5b505af1158015612c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cb09190810190614214565b91508173ffffffffffffffffffffffffffffffffffffffff16635887ab246040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612d1657600080fd5b505af1158015612d2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d4e91908101906141eb565b90508073ffffffffffffffffffffffffffffffffffffffff16631a391cb4612d966002600160028054905003815481101515612d8657fe5b9060005260206000200154611c1b565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612dce9190614ce0565b600060405180830381600087803b158015612de857600080fd5b505af1158015612dfc573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631a391cb4612e2589611c1b565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612e5d9190614b93565b600060405180830381600087803b158015612e7757600080fd5b505af1158015612e8b573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631a391cb4612eb48a611c1b565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612eec9190614d35565b600060405180830381600087803b158015612f0657600080fd5b505af1158015612f1a573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631a391cb4612f71886002815181101515612f4c57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16611d72565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612fa99190614be8565b600060405180830381600087803b158015612fc357600080fd5b505af1158015612fd7573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631a391cb461302e88600381518110151561300957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16611d72565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016130669190614dca565b600060405180830381600087803b15801561308057600080fd5b505af1158015613094573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663517c4dd98760018151811015156130c357fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016131059190614c92565b600060405180830381600087803b15801561311f57600080fd5b505af1158015613133573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631a391cb461315c87611c1b565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016131949190614c3d565b600060405180830381600087803b1580156131ae57600080fd5b505af11580156131c2573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663517c4dd98760008151811015156131f157fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016132339190614b25565b600060405180830381600087803b15801561324d57600080fd5b505af1158015613261573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631a391cb485600081518110151561329057fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016132d29190614ad0565b600060405180830381600087803b1580156132ec57600080fd5b505af1158015613300573d6000803e3d6000fd5b50505050809250505095945050505050565b606080600080600360405190808252806020026020018201604052801561334d57816020015b60608152602001906001900390816133385790505b50925060008751118015613396575061336587613a82565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614155b1561352057600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4dcade66133e289613a82565b6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161341a91906148e1565b602060405180830381600087803b15801561343457600080fd5b505af1158015613448573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061346c9190810190613fee565b90508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16141515156134e0576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016134d790614cc0565b60405180910390fd5b6134ff8173ffffffffffffffffffffffffffffffffffffffff16611d72565b83600081518110151561350e57fe5b9060200190602002018190525061353e565b8683600081518110151561353057fe5b906020019060200201819052505b60008651118015613584575061355386613a82565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614155b1561370e57600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4dcade66135d088613a82565b6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161360891906148e1565b602060405180830381600087803b15801561362257600080fd5b505af1158015613636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061365a9190810190613fee565b90508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16141515156136ce576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016136c590614b53565b60405180910390fd5b6136ed8173ffffffffffffffffffffffffffffffffffffffff16611d72565b8360018151811015156136fc57fe5b9060200190602002018190525061372c565b8583600181518110151561371e57fe5b906020019060200201819052505b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4dcade6866040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016137a391906148e1565b602060405180830381600087803b1580156137bd57600080fd5b505af11580156137d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137f59190810190613fee565b90508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614151515613869576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040161386090614d8a565b60405180910390fd5b6138888173ffffffffffffffffffffffffffffffffffffffff16611d72565b83600281518110151561389757fe5b906020019060200201819052508293505050509392505050565b6000606060008084925060009150600090505b8251811015613a7757603083828151811015156138dd57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff16101580156139db57506039838281518110151561396757fe5b9060200101517f0100000000000000000000000000000000000000","00000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff1611155b15613a6a57603083828151811015156139f057fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090040360ff16600a83020191505b80806001019150506138c4565b819350505050919050565b6000606060008084925060009150600090505b8251811015613c485760308382815181101515613aae57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff1610158015613bac575060398382815181101515613b3857fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff1611155b15613c3b5760308382815181101515613bc157fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090040360ff16600a83020191505b8080600101915050613a95565b819350505050919050565b6040805190810160405280600290602082028038833980820191505090505090565b6000613c818235615038565b905092915050565b6000613c958251615038565b905092915050565b600082601f8301121515613cb057600080fd5b8135613cc3613cbe82614e47565b614e1a565b91508181835260208401935060208101905083856020840282011115613ce857600080fd5b60005b83811015613d185781613cfe8882613c75565b845260208401935060208301925050600181019050613ceb565b5050505092915050565b600082601f8301121515613d3557600080fd5b8135613d48613d4382614e6f565b614e1a565b91508181835260208401935060208101905083856020840282011115613d6d57600080fd5b60005b83811015613d9d5781613d838882613ef2565b845260208401935060208301925050600181019050613d70565b5050505092915050565b600082601f8301121515613dba57600080fd5b8135613dcd613dc882614e97565b614e1a565b9150818183526020840193506020810190508360005b83811015613e135781358601613df98882613f1a565b845260208401935060208301925050600181019050613de3565b5050505092915050565b600082601f8301121515613e3057600080fd5b8135613e43613e3e82614ebf565b614e1a565b91508181835260208401935060208101905083856020840282011115613e6857600080fd5b60005b83811015613e985781613e7e8882613fc6565b845260208401935060208301925050600181019050613e6b565b5050505092915050565b6000613eae8251615058565b905092915050565b6000613ec2825161506a565b905092915050565b6000613ed6825161507c565b905092915050565b6000613eea825161508e565b905092915050565b6000613efe82356150a0565b905092915050565b6000613f1282516150a0565b905092915050565b600082601f8301121515613f2d57600080fd5b8135613f40613f3b82614ee7565b614e1a565b91508082526020830160208301858383011115613f5c57600080fd5b613f678382846150d8565b50505092915050565b600082601f8301121515613f8357600080fd5b8151613f96613f9182614f13565b614e1a565b91508082526020830160208301858383011115613fb257600080fd5b613fbd8382846150e7565b50505092915050565b6000613fd282356150aa565b905092915050565b6000613fe682516150aa565b905092915050565b60006020828403121561400057600080fd5b600061400e84828501613c89565b91505092915050565b60008060006060848603121561402c57600080fd5b600084013567ffffffffffffffff81111561404657600080fd5b61405286828701613c9d565b935050602061406386828701613fc6565b925050604084013567ffffffffffffffff81111561408057600080fd5b61408c86828701613da7565b9150509250925092565b600080604083850312156140a957600080fd5b600083013567ffffffffffffffff8111156140c357600080fd5b6140cf85828601613e1d565b925050602083013567ffffffffffffffff8111156140ec57600080fd5b6140f885828601613c9d565b9150509250929050565b60008060006060848603121561411757600080fd5b600084013567ffffffffffffffff81111561413157600080fd5b61413d86828701613e1d565b935050602084013567ffffffffffffffff81111561415a57600080fd5b61416686828701613c9d565b925050604084013567ffffffffffffffff81111561418357600080fd5b61418f86828701613d22565b9150509250925092565b6000602082840312156141ab57600080fd5b60006141b984828501613ea2565b91505092915050565b6000602082840312156141d457600080fd5b60006141e284828501613eb6565b91505092915050565b6000602082840312156141fd57600080fd5b600061420b84828501613eca565b91505092915050565b60006020828403121561422657600080fd5b600061423484828501613ede565b91505092915050565b60006020828403121561424f57600080fd5b600061425d84828501613f06565b91505092915050565b60006020828403121561427857600080fd5b600082015167ffffffffffffffff81111561429257600080fd5b61429e84828501613f70565b91505092915050565b6000602082840312156142b957600080fd5b60006142c784828501613fda565b91505092915050565b600080604083850312156142e357600080fd5b60006142f185828601613fda565b925050602083015167ffffffffffffffff81111561430e57600080fd5b61431a85828601613f70565b9150509250929050565b61432d81614ff8565b82525050565b600061433e82614f82565b80845260208401935061435083614f3f565b60005b8281101561438257614366868351614324565b61436f82614fc4565b9150602086019550600181019050614353565b50849250505092915050565b600061439982614f8d565b8084526020840193506143ab83614f4c565b60005b828110156143dd576143c18683516144a2565b6143ca82614fd1565b91506020860195506001810190506143ae565b50849250505092915050565b60006143f482614f98565b8084526020840193508360208202850161440d85614f59565b60005b84811015614446578383038852614428838351614514565b925061443382614fde565b9150602088019750600181019050614410565b508196508694505050505092915050565b61446081614fa3565b61446982614f66565b60005b8281101561449b5761447f8583516148d2565b61448882614feb565b915060208501945060018101905061446c565b5050505050565b6144ab81615018565b82525050565b6144ba816150b4565b82525050565b6144c9816150c6565b82525050565b6144d881615024565b82525050565b60006144e982614fb9565b8084526144fd8160208601602086016150e7565b6145068161511a565b602085010191505092915050565b600061451f82614fae565b8084526145338160208601602086016150e7565b61453c8161511a565b602085010191505092915050565b6000815460018116600081146145675760018114614587576145c8565b607f600283041680865260ff1983166020870152604086019350506145c8565b6002820480865260208601955061459d85614f70565b60005b828110156145bf578154818901526001820191506020810190506145a0565b80880195505050505b505092915050565b6000601282527f6163636f756e74206e6f742076657269667900000000000000000000000000006020830152604082019050919050565b6000600482527f64657363000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600882527f6f70657261746f720000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601482527f746f206163636f756e74206e6f7420666f756e640000000000000000000000006020830152604082019050919050565b6000600382527f73657100000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f66726f6d000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600682527f6e6f7465496400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600582527f61737365740000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601682527f66726f6d206163636f756e74206e6f7420666f756e64000000000000000000006020830152604082019050919050565b6000600782527f626f6f6b5f6e6f000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600782527f7465726d5f6e6f000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601882527f506172616d73206973206e6f7420636f6d706c69616e636500000000000000006020830152604082019050919050565b6000601a82527f6f70657261746f72206163636f756e74206e6f7420666f756e640000000000006020830152604082019050919050565b6000600282527f746f0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6148db8161502e565b82525050565b60006020820190506148f66000830184614324565b92915050565b600060808201905081810360008301526149168187614333565b905061492560208301866148d2565b818103604083015261493781856143e9565b905061494660608301846144cf565b95945050505050565b60006040820190508181036000830152614969818561438e565b905061497860208301846148d2565b9392505050565b600060","2082019050818103600083015261499981846143e9565b905092915050565b60006060820190506149b660008301856144a2565b6149c36020830184614457565b9392505050565b60006020820190506149df60008301846144cf565b92915050565b60006040820190506149fa60008301856144cf565b614a0760208301846144cf565b9392505050565b60006040820190508181036000830152614a2881856144de565b9050614a3760208301846144b1565b9392505050565b60006040820190508181036000830152614a5881856144de565b9050614a6760208301846144c0565b9392505050565b60006020820190508181036000830152614a88818461454a565b905092915050565b60006020820190508181036000830152614aa9816145d0565b9050919050565b60006020820190508181036000830152614ac981614607565b9050919050565b60006040820190508181036000830152614ae981614607565b90508181036020830152614afd8184614514565b905092915050565b60006020820190508181036000830152614b1e8161463e565b9050919050565b60006040820190508181036000830152614b3e8161463e565b9050614b4d6020830184614324565b92915050565b60006020820190508181036000830152614b6c81614675565b9050919050565b60006020820190508181036000830152614b8c816146ac565b9050919050565b60006040820190508181036000830152614bac816146ac565b90508181036020830152614bc081846144de565b905092915050565b60006020820190508181036000830152614be1816146e3565b9050919050565b60006040820190508181036000830152614c01816146e3565b90508181036020830152614c1581846144de565b905092915050565b60006020820190508181036000830152614c368161471a565b9050919050565b60006040820190508181036000830152614c568161471a565b90508181036020830152614c6a81846144de565b905092915050565b60006020820190508181036000830152614c8b81614751565b9050919050565b60006040820190508181036000830152614cab81614751565b9050614cba6020830184614324565b92915050565b60006020820190508181036000830152614cd981614788565b9050919050565b60006040820190508181036000830152614cf9816147bf565b90508181036020830152614d0d81846144de565b905092915050565b60006020820190508181036000830152614d2e816147f6565b9050919050565b60006040820190508181036000830152614d4e816147f6565b90508181036020830152614d6281846144de565b905092915050565b60006020820190508181036000830152614d838161482d565b9050919050565b60006020820190508181036000830152614da381614864565b9050919050565b60006020820190508181036000830152614dc38161489b565b9050919050565b60006040820190508181036000830152614de38161489b565b90508181036020830152614df781846144de565b905092915050565b6000602082019050614e1460008301846148d2565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e3d57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e5e57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614e8657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614eae57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614ed657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614efe57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f2a57600080fd5b601f19601f8301169050602081019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000819050919050565b60008160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061506382614ff8565b9050919050565b600061507582614ff8565b9050919050565b600061508782614ff8565b9050919050565b600061509982614ff8565b9050919050565b6000819050919050565b6000819050919050565b60006150bf82614ff8565b9050919050565b60006150d182614ff8565b9050919050565b82818337600083830152505050565b60005b838110156151055780820151818401526020810190506150ea565b83811115615114576000848401525b50505050565b6000601f19601f83011690509190505600a265627a7a723058209582c530e9715d1ba73720a0c300e7c160190e06cb26fbb78093a645298285656c6578706572696d656e74616cf50037"};

    public static final String SM_BINARY = String.join("", SM_BINARY_ARRAY);

    public static final String[] ABI_ARRAY = {"[{\"constant\":false,\"inputs\":[],\"name\":\"getAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"uintCondition\",\"type\":\"uint256[]\"},{\"name\":\"addressConditon\",\"type\":\"address[]\"},{\"name\":\"limit\",\"type\":\"int256[]\"}],\"name\":\"query\",\"outputs\":[{\"name\":\"\",\"type\":\"string[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionAddress\",\"type\":\"address[]\"},{\"name\":\"noteId\",\"type\":\"uint256\"},{\"name\":\"stringValueList\",\"type\":\"string[]\"}],\"name\":\"write\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"uint256[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"uintCondition\",\"type\":\"uint256[]\"},{\"name\":\"addressConditon\",\"type\":\"address[]\"}],\"name\":\"handleCondiction\",\"outputs\":[{\"name\":\"\",\"type\":\"bool[]\"},{\"name\":\"existNum\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"addBook\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"termAddress\",\"type\":\"address\"},{\"name\":\"assetName\",\"type\":\"string\"},{\"name\":\"org\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"transactionAddress\",\"type\":\"address[]\"},{\"indexed\":false,\"name\":\"noteId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"stringValueList\",\"type\":\"string[]\"},{\"indexed\":false,\"name\":\"count\",\"type\":\"int256\"}],\"name\":\"InsertResult\",\"type\":\"event\"}]"};

    public static final String ABI = String.join("", ABI_ARRAY);

    public static final String FUNC_GETADDRESS = "getAddress";

    public static final String FUNC_QUERY = "query";

    public static final String FUNC_WRITE = "write";

    public static final String FUNC_HANDLECONDICTION = "handleCondiction";

    public static final String FUNC_ADDBOOK = "addBook";

    public static final Event INSERTRESULT_EVENT = new Event("InsertResult", 
            Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<Address>>() {}, new TypeReference<Uint256>() {}, new TypeReference<DynamicArray<Utf8String>>() {}, new TypeReference<Int256>() {}));
    ;

    protected NonFungibleBook(String contractAddress, Client client, CryptoKeyPair credential) {
        super(getBinary(client.getCryptoSuite()), contractAddress, client, credential);
    }

    public static String getBinary(CryptoSuite cryptoSuite) {
        return (cryptoSuite.getCryptoTypeConfig() == CryptoType.ECDSA_TYPE ? BINARY : SM_BINARY);
    }

    public TransactionReceipt getAddress() {
        final Function function = new Function(
                FUNC_GETADDRESS, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void getAddress(TransactionCallback callback) {
        final Function function = new Function(
                FUNC_GETADDRESS, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForGetAddress() {
        final Function function = new Function(
                FUNC_GETADDRESS, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getGetAddressOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_GETADDRESS, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public List query(List<BigInteger> uintCondition, List<String> addressConditon, List<BigInteger> limit) throws ContractException {
        final Function function = new Function(FUNC_QUERY, 
                Arrays.<Type>asList(uintCondition.isEmpty()? DynamicArray.empty("uint256[]"):new DynamicArray<Uint256>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(uintCondition, Uint256.class)),
                addressConditon.isEmpty()? DynamicArray.empty("address[]"):new DynamicArray<Address>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(addressConditon, Address.class)),
                limit.isEmpty()? DynamicArray.empty("int256[]"):new DynamicArray<Int256>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(limit, Int256.class))),
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<Utf8String>>() {}));
        List<Type> result = (List<Type>) executeCallWithSingleValueReturn(function, List.class);
        return convertToNative(result);
    }

    public TransactionReceipt write(List<String> transactionAddress, BigInteger noteId, List<String> stringValueList) {
        final Function function = new Function(
                FUNC_WRITE, 
                Arrays.<Type>asList(transactionAddress.isEmpty()? DynamicArray.empty("address[]"):new DynamicArray<Address>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(transactionAddress, Address.class)),
                new Uint256(noteId),
                stringValueList.isEmpty()? DynamicArray.empty("string[]"):new DynamicArray<Utf8String>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(stringValueList, Utf8String.class))),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void write(List<String> transactionAddress, BigInteger noteId, List<String> stringValueList, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_WRITE, 
                Arrays.<Type>asList(transactionAddress.isEmpty()? DynamicArray.empty("address[]"):new DynamicArray<Address>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(transactionAddress, Address.class)),
                new Uint256(noteId),
                stringValueList.isEmpty()? DynamicArray.empty("string[]"):new DynamicArray<Utf8String>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(stringValueList, Utf8String.class))),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForWrite(List<String> transactionAddress, BigInteger noteId, List<String> stringValueList) {
        final Function function = new Function(
                FUNC_WRITE, 
                Arrays.<Type>asList(transactionAddress.isEmpty()? DynamicArray.empty("address[]"):new DynamicArray<Address>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(transactionAddress, Address.class)),
                new Uint256(noteId),
                stringValueList.isEmpty()? DynamicArray.empty("string[]"):new DynamicArray<Utf8String>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(stringValueList, Utf8String.class))),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple3<List<String>, BigInteger, List<String>> getWriteInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_WRITE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<Address>>() {}, new TypeReference<Uint256>() {}, new TypeReference<DynamicArray<Utf8String>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple3<List<String>, BigInteger, List<String>>(

                convertToNative((List<Address>) results.get(0).getValue()), 
                (BigInteger) results.get(1).getValue(), 
                convertToNative((List<Utf8String>) results.get(2).getValue())
                );
    }

    public Tuple2<Boolean, List<BigInteger>> getWriteOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_WRITE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}, new TypeReference<StaticArray2<Uint256>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<Boolean, List<BigInteger>>(

                (Boolean) results.get(0).getValue(), 
                convertToNative((List<Uint256>) results.get(1).getValue())
                );
    }

    public Tuple2<List<Boolean>, BigInteger> handleCondiction(List<BigInteger> uintCondition, List<String> addressConditon) throws ContractException {
        final Function function = new Function(FUNC_HANDLECONDICTION, 
                Arrays.<Type>asList(uintCondition.isEmpty()? DynamicArray.empty("uint256[]"):new DynamicArray<Uint256>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(uintCondition, Uint256.class)),
                addressConditon.isEmpty()? DynamicArray.empty("address[]"):new DynamicArray<Address>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(addressConditon, Address.class))),
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<Bool>>() {}, new TypeReference<Uint256>() {}));
        List<Type> results = executeCallWithMultipleValueReturn(function);
        return new Tuple2<List<Boolean>, BigInteger>(
                convertToNative((List<Bool>) results.get(0).getValue()), 
                (BigInteger) results.get(1).getValue());
    }

    public TransactionReceipt addBook() {
        final Function function = new Function(
                FUNC_ADDBOOK, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void addBook(TransactionCallback callback) {
        final Function function = new Function(
                FUNC_ADDBOOK, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForAddBook() {
        final Function function = new Function(
                FUNC_ADDBOOK, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<BigInteger> getAddBookOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_ADDBOOK, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<BigInteger>(

                (BigInteger) results.get(0).getValue()
                );
    }

    public List<InsertResultEventResponse> getInsertResultEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = extractEventParametersWithLog(INSERTRESULT_EVENT, transactionReceipt);
        ArrayList<InsertResultEventResponse> responses = new ArrayList<InsertResultEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            InsertResultEventResponse typedResponse = new InsertResultEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.transactionAddress = (List<String>) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.noteId = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
            typedResponse.stringValueList = (List<String>) eventValues.getNonIndexedValues().get(2).getValue();
            typedResponse.count = (BigInteger) eventValues.getNonIndexedValues().get(3).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeInsertResultEvent(String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(INSERTRESULT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,fromBlock,toBlock,otherTopics,callback);
    }

    public void subscribeInsertResultEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(INSERTRESULT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,callback);
    }

    public static NonFungibleBook load(String contractAddress, Client client, CryptoKeyPair credential) {
        return new NonFungibleBook(contractAddress, client, credential);
    }

    public static NonFungibleBook deploy(Client client, CryptoKeyPair credential, String termAddress, String assetName, String org) throws ContractException {
        String encodedConstructor = FunctionEncoder.encodeConstructor(Arrays.<Type>asList(new Address(termAddress),
                new Utf8String(assetName),
                new Address(org)));
        return deploy(NonFungibleBook.class, client, credential, getBinary(client.getCryptoSuite()), encodedConstructor);
    }

    public static class InsertResultEventResponse {
        public TransactionReceipt.Logs log;

        public List<String> transactionAddress;

        public BigInteger noteId;

        public List<String> stringValueList;

        public BigInteger count;
    }
}
